package module.course;

import common.model.Entity.Student;
import common.model.Entity.courseEntity.Course;
import common.model.Entity.courseEntity.CourseLocation;
import common.model.Entity.courseEntity.CourseSchedule;
import network.protocol.Response;

import java.util.List;

/**
 * 课程服务接口，提供课程管理、选课管理、教师课程管理、教室管理和排课功能。
 */
public interface CourseService {

    // ==================== 课程管理 ====================

    /**
     * 根据ID查询课程信息。
     *
     * @param id 课程ID
     * @return 包含课程信息的 Response
     */
    Response<Course> findById(Long id);

    /**
     * 查询所有课程。
     *
     * @return 课程列表的 Response
     */
    Response<List<Course>> findAll();

    /**
     * 根据课程名称模糊查询课程列表。
     *
     * @param name 课程名称
     * @return 查询结果的 Response
     */
    Response<List<Course>> findByName(String name);

    /**
     * 根据课程编号查询课程列表。
     *
     * @param code 课程编号
     * @return 查询结果的 Response
     */
    Response<List<Course>> findByCode(String code);

    /**
     * 查询状态为启用的课程。
     *
     * @return 启用课程列表的 Response
     */
    Response<List<Course>> findStatusTrue();

    /**
     * 创建新课程。
     *
     * @param course 课程信息
     * @return 创建结果的 Response
     */
    Response<Boolean> createCourse(Course course);

    /**
     * 更新课程信息。
     *
     * @param course 课程信息
     * @return 更新结果的 Response
     */
    Response<Boolean> updateCourse(Course course);

    /**
     * 删除课程。
     *
     * @param id 课程ID
     * @return 删除结果的 Response
     */
    Response<Boolean> deleteCourse(Long id);

    /**
     * 查询课程及其排课信息。
     *
     * @param id 课程ID
     * @return 包含课程排课信息的 Response
     */
    Response<List<CourseSchedule>> findCourseWithSchedule(Long id);

    /**
     * 根据教师ID查询教师姓名。
     *
     * @param id 教师ID
     * @return 教师姓名的 Response
     */
    Response<String> findTeacherNameByTeacherId(Long id);

    // ==================== 选课管理 ====================

    /**
     * 学生选课。
     *
     * @param courseId 课程ID
     * @param studentId 学生ID
     * @return 选课结果的 Response
     */
    Response<Boolean> enrollStudent(Long courseId, Long studentId);

    /**
     * 学生退课。
     *
     * @param courseId 课程ID
     * @param studentId 学生ID
     * @return 退课结果的 Response
     */
    Response<Boolean> dropStudent(Long courseId, Long studentId);

    /**
     * 查询选修某课程的学生列表。
     *
     * @param courseId 课程ID
     * @return 学生列表的 Response
     */
    Response<List<Student>> findStudentsByCourseId(Long courseId);

    /**
     * 查询学生已选课程列表。
     *
     * @param studentId 学生ID
     * @return 学生已选课程列表的 Response
     */
    Response<List<Course>> findSelectedCourseByStudentId(Long studentId);

    // ==================== 教师课程管理 ====================

    /**
     * 教师申请开设课程。
     *
     * @param course 课程信息
     * @return 申请结果的 Response
     */
    Response<Boolean> applyCourse(Course course);

    /**
     * 教师更新自己开设的课程信息。
     *
     * @param teacherId 教师ID
     * @param course 更新后的课程信息
     * @return 更新结果的 Response
     */
    Response<Boolean> updateMyCourse(Long teacherId, Course course);

    /**
     * 根据教师姓名查询教师开设的课程列表。
     *
     * @param teacherName 教师姓名
     * @return 教师课程列表的 Response
     */
    Response<List<Course>> findCoursesByTeacher(String teacherName);

    // ==================== 教室管理 ====================

    /**
     * 根据ID查询教室信息。
     *
     * @param id 教室ID
     * @return 教室信息的 Response
     */
    Response<CourseLocation> findLocationById(Long id);

    /**
     * 新增教室信息。
     *
     * @param location 教室信息
     * @return 新增结果的 Response
     */
    Response<Boolean> insertNewLocation(CourseLocation location);

    /**
     * 查询所有教室信息。
     *
     * @return 教室列表的 Response
     */
    Response<List<CourseLocation>> findAllLocation();

    /**
     * 更新教室信息。
     *
     * @param originLocation 原教室信息
     * @param newLocation 新教室信息
     * @return 更新结果的 Response
     */
    Response<Boolean> updateLocation(CourseLocation originLocation, CourseLocation newLocation);

    /**
     * 删除教室信息。
     *
     * @param location 教室信息
     * @return 删除结果的 Response
     */
    Response<Boolean> deleteLocation(CourseLocation location);

    /**
     * 根据教学楼查询教室列表。
     *
     * @param building 教学楼名称
     * @return 教室列表的 Response
     */
    Response<List<CourseLocation>> findByBuilding(String building);

    /**
     * 根据教室号查询教室列表。
     *
     * @param roomNumber 教室号
     * @return 教室列表的 Response
     */
    Response<List<CourseLocation>> findByRoomNumber(String roomNumber);

    /**
     * 根据教学楼和教室号查询教室。
     *
     * @param building 教学楼
     * @param roomNumber 教室号
     * @return 教室信息的 Response
     */
    Response<CourseLocation> findByBuildingAndRoomNumber(String building, String roomNumber);

    /**
     * 获取教室数量。
     *
     * @return 教室数量的 Response
     */
    Response<Long> getLocationCount();

    // ==================== 排课 ====================

    /**
     * 自动排课。
     *
     * @return 排课结果的 Response
     */
    Response<Boolean> scheduleCourse();
}


